from datetime import datetime

from app import sql as db


class News(db.Model):
    """论坛帖子"""
    __tablename__ = "news"

    id = db.Column(db.Integer, primary_key=True)  # 新闻编号
    title = db.Column(db.String(256), nullable=False)  # 帖子标题
    award = db.Column(db.Integer, nullable=False)  # 悬赏飞吻
    content = db.Column(db.Text, nullable=False)  # 帖子内容
    clicks = db.Column(db.Integer, default=0)  # 浏览量
    comment_num = db.Column(db.Integer, default=0)  # 评论量

    category_id = db.Column(db.Integer, db.ForeignKey("category.id"))
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), default=2)  # 当前新闻的作者id
    status = db.Column(db.Integer, default=1)  # 当前帖子状态 如果为0代表审核通过，1代表审核中，-1代表审核不通过

    reason = db.Column(db.String(256))  # 未通过原因，status = -1 的时候使用
    create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间
    update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)  # 记录的更新时间
    category = db.relationship('Category', backref='news')
    user = db.relationship('User', backref='news')
    comment = db.relationship('Comment', lazy='dynamic', backref="news")


class Category(db.Model):
    """新闻分类"""
    __tablename__ = "category"

    id = db.Column(db.Integer, primary_key=True)  # 分类编号
    name = db.Column(db.String(64), nullable=False)  # 分类名
    create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间
    update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)  # 记录的更新时间


class Comment(db.Model):
    """帖子评论表"""
    __tablename__ = "comment"
    id = db.Column(db.Integer, primary_key=True)  # 评论id
    content = db.Column(db.Text, nullable=False)  # 评论内容

    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))  # 当前评论的作者id
    news_id = db.Column(db.Integer, db.ForeignKey("news.id"))  # 当前评论的新闻id
    comment_user = db.Column(db.Integer, db.ForeignKey("comment.id"))  # 是否是回复别人的评论

    create_time = db.Column(db.DateTime, default=datetime.now)  # 记录的创建时间
    user = db.relationship('User', backref='comment')    # 通过评论查询用户


class Follow(db.Model):
    """用关注表"""
    __tablename__ = "follow"
    followed_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)  # 被关注人的id
    follower_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)  # 粉丝id
    create_time = db.Column(db.DateTime, default=datetime.now)


class Collection(db.Model):
    __tablename__ = "user_collection"
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), primary_key=True)  # 用户id
    news_id = db.Column(db.Integer, db.ForeignKey("news.id"), primary_key=True)  # 帖子id
    create_time = db.Column(db.DateTime, default=datetime.now)  # 收藏创建时间
    news = db.relationship('News', backref='collection')    # 通过收藏查询帖子


class User(db.Model):
    """用户"""
    __tablename__ = "user"

    id = db.Column(db.Integer, primary_key=True)  # 用户编号
    nick_name = db.Column(db.String(32), unique=True, nullable=False)  # 用户昵称
    password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码
    email = db.Column(db.String(128), unique=True, nullable=False)  # 邮箱
    avatar_url = db.Column(db.String(256))  # 用户头像路径
    last_login = db.Column(db.DateTime, default=datetime.now)  # 最后一次登录时间
    create_time = db.Column(db.DateTime, default=datetime.now())  # 创建账号时间
    is_admin = db.Column(db.Boolean, default=False)   # 是否是管理员
    signature = db.Column(db.String(512))  # 用户签名
    is_vip = db.Column(db.Integer, default=0)   # 是否是vip， 默认是0， 0则不是
    gender = db.Column(  # 性别
        db.Enum(
            "MAN",  # 男
            "WOMAN"  # 女
        ),
        default="MAN"
    )
    activate = db.Column(db.String(256))   # 用户是否已经通过邮箱激活了， 0表示已经激活了， 如果没有激活， 则不能发帖， 也不能回帖
    forget = db.Column(db.String(256), default=0)      # 用户可以重新设置密码

    award = db.Column(db.Integer, default=0)  # 用户的飞吻数
    continuous_sign_in = db.Column(db.Integer, default=0)  # 用户连续签到的天数
    sign_in_time = db.Column(db.Integer, default=0)  # 用户连续签到的天数
    followers = db.relationship('User',
                                secondary=Follow.__tablename__,
                                primaryjoin=(id == Follow.followed_id),
                                secondaryjoin=(id == Follow.follower_id),
                                # 设置反向查询的时候不将数据全部查询
                                backref=db.backref('followed', lazy='dynamic'),
                                # lazy 的默认值是select 将数据全部查询， 而dynamic是返回一个qurey的对象，
                                # 什么时候用的时候就什么时候查
                                lazy='dynamic')
